#include <jni.h>
#include <string>
#include <android/log.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <sys/inotify.h>
#include <unistd.h>

#define LOG_TAG "aruba"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)

extern "C"
JNIEXPORT void JNICALL
Java_com_aruba_uninstallapplication_UninstallUtil_startUninstallWatch(JNIEnv *env, jobject instance,
                                                                      jstring path_, jint sdk) {
    const char *path = env->GetStringUTFChars(path_, 0);

    pid_t pid = fork();
    if (pid > 0) {//父进程
        LOGD("父进程");
    }else {//子进程
        //文件句柄
        int m_fd = inotify_init();
        //IN_ACCESS，即文件被访问
        //IN_MODIFY，文件被 write
        //IN_ATTRIB，文件属性被修改，如 chmod、chown、touch 等
        //IN_CLOSE_WRITE，可写文件被 close
        //IN_CLOSE_NOWRITE，不可写文件被 close
        //IN_OPEN，文件被 open
        //IN_MOVED_FROM，文件被移走,如 mv
        //IN_MOVED_TO，文件被移来，如 mv、cp
        //IN_CREATE，创建新文件
        //IN_DELETE，文件被删除，如 rm
        //IN_DELETE_SELF，自删除，即一个可执行文件在执行时删除自己
        //IN_MOVE_SELF，自移动，即一个可执行文件在执行时移动自己
        //IN_UNMOUNT，宿主文件系统被 umount
        //IN_CLOSE，文件被关闭，等同于(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)
        //IN_MOVE，文件被移动，等同于(IN_MOVED_FROM | IN_MOVED_TO)
        //注：上面所说的文件也包括目录。
        //开始监听
        int res = inotify_add_watch(m_fd, path, IN_DELETE_SELF);

        //阻塞，是否被删除
        char event_buf[512];
        struct inotify_event* event;
        int num_bytes = read(m_fd, event_buf, sizeof(event_buf));

        //被删除了，移除监听
        inotify_rm_watch(m_fd, (uint32_t) res);

        //使用am命令跳转浏览器
        if (sdk < 17) {
            execlp("am", "am", "start", "-a", "android.intent.action.VIEW", "-d",
                   "http://www.baidu.com", NULL);
        } else {//17以后，新增多用户的操作
            execlp("am", "am", "start", "--user", "0", "-a", "android.intent.action.VIEW", "-d",
                   "http://www.baidu.com", NULL);
        }
    }

    env->ReleaseStringUTFChars(path_, path);
}
